package com.wmx.jdbc_template_app.controller;

import com.wmx.jdbc_template_app.pojo.Dept;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * DriverManagerDataSource 驱动管理器数据源
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/4/27 20:10
 */
@RestController
public class DeptController2 {

    /**
     * 新增部门信息
     * 1、因为是方法内部定义的数据源，所以即使在方法上添加 @SuppressWarnings 注解，也是无法控制事务的，只能使用编程式事务。
     * <p>
     * http://localhost:8080/dept2/addData?
     * {"dname":"大数据研发","loc":"新化"}
     * <p>
     * DriverManagerDataSource(String url, String username, String password)：数据集连接地址，账号，密码
     *
     * @param dept
     * @return
     */
    @PostMapping("dept2/addData")
    @SuppressWarnings("all")
    public Object addData(@RequestBody Dept dept) throws SQLException {
        int count = 0;
        Connection conn = null;
        PreparedStatement prepareStatement = null;
        try {
            /**获取驱动管理数据源，写法和原生的 {@link OriginalJdbcController} 完全一样
             * 它的底层也是使用 DriverManager 创建的连接.*/
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=UTC");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            // 获取连接
            conn = dataSource.getConnection();

            // 关闭事务自动提交，改为手动提交
            conn.setAutoCommit(false);

            // 获取预编译SQL语句对象
            String sql = "INSERT INTO dept(deptno, dname, loc) VALUES (null,?,?)";
            prepareStatement = conn.prepareStatement(sql);
            // 设置占位符参数的值(索引从1开始，表示第几个占位符)
            prepareStatement.setString(1, dept.getDname());
            prepareStatement.setString(2, dept.getLoc());

            // 执行SQL操作，返回成功插入的条数
            count = prepareStatement.executeUpdate();

            // 提交事务
            conn.commit();
        } catch (Exception e) {
            // 回滚事务
            conn.rollback();
            e.printStackTrace();
        } finally {
            // 释放资源
            if (prepareStatement != null && !prepareStatement.isClosed()) {
                prepareStatement.close();
            }
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        }
        return count;
    }


}
